package com.zhangzhan.gulimallcommcon.util;

import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author 张一恒
 * @version 1.0
 * @description:
 * @date 2024/1/30 22:40
 */
@Slf4j
public class CopyBean {

    /**
     * 类对象拷贝
     */
    public static <T> T copyBean(Object o, Class<T> clazz) {
//        将源对象赋值到目标对象方法：
//        方法一：BeanUtils.copyProperties(源对象, 目标对象); //cn.hutool.core.bean.BeanUtil;
//        方法二：目标对象 = JSONObject.parseObject(JSON.toJSONString(源对象), 目标对象.class); //com.alibaba.fastjson.JSON; com.alibaba.fastjson.JSONObject;
//
//        实测结果方法一的耗时为方法二的2-3倍。
        T res = null;
        try {
            res = BeanUtil.copyProperties(o,clazz);
        } catch (ClassCastException e) {
            res =  (T) JSON.parseObject(JSON.toJSONString(o));
        }catch (Exception e){
            throw new RuntimeException("拷贝失败");
        }
        return res;
    }


    /**
     * 集合对象拷贝
     */
    public static <T, O> List<T> copyBeanList(List<O> os, Class<T> clazz) {

        //利用反射创建对象
        return os.stream().map(po -> copyBean(po, clazz)).collect(Collectors.toList());
    }
}
